﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Windows;
using CalculoPreciosUnitarios.BaseDeDatos.cotizararticuloDataSetTableAdapters;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Rubro;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Unidad;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using CalculoPreciosUnitarios.Logica.GestorObject.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorObject.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Logica.GestorObject.Rubro;
using CalculoPreciosUnitarios.Logica.GestorObject.Unidad;
using MySql.Data.MySqlClient;


namespace CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.CotizarArticulos
{
    public class CotizarArticulosDB : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private IFormatProvider argento = new System.Globalization.CultureInfo("es-AR");


        #region propiedades

        private decimal _subtotal;
        public decimal SubTotal
        {
            get
            {
                return _subtotal;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _subtotal = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
            }
        }

        //private Int16   _cantidad_articulo;
        //public Int16 Cantidad_articulo
        //{
        //    get
        //    {
        //        return _cantidad_articulo;
        //    }
        //    set
        //    {
        //        //precio = Convert.ToDecimal(value, english);         
        //        _cantidad_articulo = value;
        //        //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
        //    }
        //}

        private decimal _porcentaje_manoDeObra;
        public decimal Porcentaje_manoDeObra
        {
            get
            {
                return _porcentaje_manoDeObra;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _porcentaje_manoDeObra = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Porcentaje_manoDeObra"));
            }
        }
 
        private decimal _porcentaje_gastosFijos;
        public decimal Porcentaje_gastosFijos
        {
            get
            {
                return _porcentaje_gastosFijos;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _porcentaje_gastosFijos = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Porcentaje_gastosFijos"));
            }
        }

        private decimal _porcentaje_rentabilidad;
        public decimal Porcentaje_rentabilidad
        {
            get
            {
                return _porcentaje_rentabilidad;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _porcentaje_rentabilidad = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Porcentaje_rentabilidad"));
            }
        }

        private decimal _porcentaje_insumos;
        public decimal Porcentaje_insumos
        {
            get
            {
                return _porcentaje_insumos;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _porcentaje_insumos = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Porcentaje_insumos"));
            }
        }

        private decimal _porcentaje_iva;
        public decimal Porcentaje_iva
        {
            get
            {
                return _porcentaje_iva;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _porcentaje_iva = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Porcentaje_iva"));
            }
        }

        private decimal _precio_neto;
        public decimal Precio_neto
        {
            get
            {
                return _precio_neto;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _precio_neto = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Precio_neto"));
            }
        }

        private decimal _unidad_neto;
        public decimal Unidad_neto
        {
            get
            {
                return _unidad_neto;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _unidad_neto = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Unidad_neto"));
            }
        }

        private decimal _unidad_final;
        public decimal Unidad_final
        {
            get
            {
                return _unidad_final;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _unidad_final = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Unidad_final"));
            }
        }

        //private decimal _manoDeObra;
        //public decimal ManoDeObra
        //{
        //    get
        //    {
        //        return _manoDeObra;
        //    }
        //    set
        //    {
        //        //precio = Convert.ToDecimal(value, english);         
        //        _manoDeObra = value;
        //        //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
        //    }
        //}

        //private decimal _gastosFijos;
        //public decimal GastosFijos
        //{
        //    get
        //    {
        //        return _gastosFijos;
        //    }
        //    set
        //    {
        //        //precio = Convert.ToDecimal(value, english);         
        //        _gastosFijos = value;
        //        //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
        //    }
        //}

        //private decimal _rentabilidad;
        //public decimal Rentabilidad
        //{
        //    get
        //    {
        //        return _rentabilidad;
        //    }
        //    set
        //    {
        //        //precio = Convert.ToDecimal(value, english);         
        //        _rentabilidad = value;
        //        //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
        //    }
        //}

        //private decimal _insumos;
        //public decimal Insumos
        //{
        //    get
        //    {
        //        return _insumos;
        //    }
        //    set
        //    {
        //        //precio = Convert.ToDecimal(value, english);         
        //        _insumos = value;
        //        //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
        //    }
        //}

        //private decimal _iva;
        //public decimal Iva
        //{
        //    get
        //    {
        //        return _iva;
        //    }
        //    set
        //    {
        //        //precio = Convert.ToDecimal(value, english);         
        //        _iva = value;
        //        //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
        //    }
        //}

        private List<SubRubroCS> _listaSubRubros;
        public List<SubRubroCS> ListaSubRubros
        {
            get
            {
                return _listaSubRubros;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _listaSubRubros = value;
                if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ListaSubRubros"));
            }
        }

        private List<CotizarArticulosCS> _listaDeCotizacion;
        public List<CotizarArticulosCS> ListaCotizar
        {
            get
            {
                return _listaDeCotizacion;
            }
            set
            {
                //precio = Convert.ToDecimal(value, english);         
                _listaDeCotizacion = value;
                //if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("SubTotal"));
            }
        }

        #endregion propiedades

        #region Constructor
        public CotizarArticulosDB()
        {
            //no se si esta bien esto pero me parecio de momento.....
            SubTotal = 0;
            //_cantidad_articulo = 0;
            Porcentaje_manoDeObra = 0;
            Porcentaje_gastosFijos = 0;
            Porcentaje_rentabilidad = 0;
            Porcentaje_insumos = 0;
            Porcentaje_iva = 0;
            //_manoDeObra = 0;
            //_gastosFijos = 0;
            //_rentabilidad = 0;
            //_insumos = 0;
            //_iva = 0;
            Precio_neto = 0;
            Unidad_neto = 0;
            Unidad_final = 0;
            _listaSubRubros  = new List<SubRubroCS>();
            _listaDeCotizacion = new List<CotizarArticulosCS>(); 
        }

        #endregion

        /// <summary>
        /// Obtiene las cotizaciones de un articulo por el Sub Rubro pasado como parametro
        /// </summary>
        /// <param name="subRubro">El Sub Rubro utilizado para buscar</param>
        /// <returns>La lista de cotizaciones buscadas; vacio, en caso de no encontrar nada</returns>

        public List<CotizarArticulosCS> ObtenerCotizarArticulosPorRubro_y_SubRubro(SubRubroCS subRubro)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            List<CotizarArticulosCS> resultados = new List<CotizarArticulosCS>();

            string codigoRubro = subRubro.IdRubro;
            string codigoSubRubro = subRubro.IdSubRubro;

            try
            {
                DataTable tabla = cotizarTA.GetDataByObtenerCotizarArticuloPorRubro_y_SubRubro(codigoRubro, codigoSubRubro);

                if (tabla.Rows.Count > 0)
                {
                    foreach (DataRow item in tabla.Rows)
                    {
                        CotizarArticulosCS cotizar = new CotizarArticulosCS();

                        cotizar.IdArticulo = item["id_articulo"].ToString().ToUpper();
                        cotizar.CantidadArticulos = Convert.ToInt16(item["cantidadArt"].ToString());
                        cotizar.Renglon = Convert.ToInt16(item["renglon"].ToString());
                        cotizar.IdRubro = item["id_rubro"].ToString();
                        cotizar.IdSubRubro = item["id_subrubro"].ToString();
                        cotizar.Cantidad = Convert.ToDecimal(item["cantidad"].ToString());
                        cotizar.IdUnidad = item["id_unidad"].ToString();

                        resultados.Add(cotizar);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class CotizarArticulosDB -- Methods ObtenerCotizarArticulosPorRubro_y_SubRubro(codigoRubro, codigoSubRubro))", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        /// <summary>
        /// Obtiene cotizaciones por el codigo de Unidad
        /// </summary>
        /// <param name="unidad">Unidad con el codigo utilizado</param>
        /// <returns>Las cotizaciones buscadas; Vacio si no se encuentra nada</returns>
        public List<CotizarArticulosCS> ObtenerCotizarArticuloPorUnidad(UnidadCS unidad)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            List<CotizarArticulosCS> resultados = new List<CotizarArticulosCS>();

            string codigoUnidad = unidad.IdUnidad;

            try
            {
                DataTable tabla = cotizarTA.GetDataByObtenerCotizacionesPorCodigoDeUnidad(codigoUnidad);

                if (tabla.Rows.Count > 0)
                {
                    foreach (DataRow item in tabla.Rows)
                    {
                        CotizarArticulosCS cotizar = new CotizarArticulosCS();

                        cotizar.IdArticulo = item["id_articulo"].ToString().ToUpper();
                        cotizar.CantidadArticulos = Convert.ToInt16(item["cantidadArt"].ToString());
                        cotizar.Renglon = Convert.ToInt16(item["renglon"].ToString());
                        cotizar.IdRubro = item["id_rubro"].ToString();
                        cotizar.IdSubRubro = item["id_subrubro"].ToString();
                        cotizar.Cantidad = Convert.ToDecimal(item["cantidad"].ToString());
                        cotizar.IdUnidad = item["id_unidad"].ToString();

                        resultados.Add(cotizar);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class CotizarArticulosDB -- Methods ObtenerCotizarArticuloPorUnidad(codigoUnidad)", "Cuidado", MessageBoxButton.OK);
            }

            return resultados;
        }

        /// <summary>
        /// Elimina la cotizacion de articulo pasada como parametro
        /// </summary>
        /// <param name="cotizar">cotizacion a eliminar</param>
        /// <returns>1 exitoso; 0 fallido</returns>
        private int EliminarCotizarArticulo(CotizarArticulosCS cotizar)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();
            int resultadoConsulta = 0;

            cotizarTA.Connection.Open();
            MySqlTransaction mitransaccion = cotizarTA.Connection.BeginTransaction();       
            try
            {
                resultadoConsulta = cotizarTA.DeleteCotizarArticulo(cotizar.IdArticulo, cotizar.CantidadArticulos, cotizar.Renglon);
                if (resultadoConsulta == 1)
                {
                    mitransaccion.Commit();
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show(e.Message + " Error -- Class CotizarArticulosDB -- Methods EliminarCotizarArticulo(cotizarArticulo)");
            }

            cotizarTA.Connection.Close();
            return resultadoConsulta;
        }

        /// <summary>
        /// Elimina cotizaciones de articulos que coindicen con el Sub Rubro pasado como parametro
        /// </summary>
        /// <param name="subRubro">El Sub Rubro utilizado para buscar</param>
        /// <returns>1 Exitoso; 0 Fallido</returns>
        public int EliminarCotizacionesDeArticulosSegunElSubRubro(SubRubroCS subRubro)
        {
            string codigoRubro = subRubro.IdRubro;
            string codigoSubRubro = subRubro.IdSubRubro;
            int resultadoConsulta = 1;
            List<CotizarArticulosCS> articulosCotizados = ObtenerCotizarArticulosPorRubro_y_SubRubro(subRubro);
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            try
            {
                if (articulosCotizados.Count > 0)
                {
                    foreach (CotizarArticulosCS item in articulosCotizados)
                    {
                        resultadoConsulta *= EliminarCotizarArticulo(item);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class CotizarArticulosDB -- Methods EliminarCotizacionesDeArticulosSegunElSubRubro(subRubro)");
            }

            return resultadoConsulta;
        }


        /// <summary>
        /// Agrega las cotizaciones pasadas como parametro
        /// </summary>
        /// <param name="cotizaciones">lista de cotizaciones a agregar</param>
        /// <returns>1 Exito; 0 fallido</returns>
        public int CargarCotizaciones(List<CotizarArticulosCS> cotizaciones)
        {
            int resultadoConsulta = 1;

            CotizarArticulosDB _cotizarDB = new CotizarArticulosDB();
            articulosDB _articuloDB = new articulosDB();
            CargaPorcentualesCantidadesBD porcentualesDB = new CargaPorcentualesCantidadesBD();
            List<ArticuloCS> _listaArticulos = new List<ArticuloCS>();
            List<CargaPorcentualesCantidadesCS> _listaPorcentuales = new List<CargaPorcentualesCantidadesCS>();
            //List<Temporal> resultadoLista = new List<Temporal>();

            if (cotizaciones.Count > 0)
            {
                foreach (CotizarArticulosCS item in cotizaciones)
                {
                    ArticuloCS _articuloAux = new ArticuloCS();
                    _articuloAux.Codigo = item.IdArticulo;
                    _listaArticulos = _articuloDB.busca_Articulo_por_Codigo(_articuloAux);
                    if(_listaArticulos.Count <= 0)
                        continue;
                    _articuloAux = _listaArticulos[0];

                    CargaPorcentualesCantidadesCS porcentual = new CargaPorcentualesCantidadesCS();
                    porcentual.CodigoArticulo = item.IdArticulo;
                    porcentual.CantidadArticulos = (short)item.CantidadArticulos;

                    _listaPorcentuales = porcentualesDB.busca_Porcentajes_Cantidades_por_CodigoyCantidades(porcentual);
                    if (_listaPorcentuales.Count <= 0)
                        continue;
                    porcentual = _listaPorcentuales[0];

                    resultadoConsulta *= _cotizarDB.agregarCotizacionPorExcel(_articuloAux, porcentual, item);
                    //Temporal auxTemp = new Temporal();
                    //auxTemp.cotizar = item;
                    //auxTemp.resultado = resultadoConsulta;
                    //resultadoLista.Add(auxTemp);
                    //if (resultadoConsulta == 0)
                    //    break;
                }
            }

            //int contador = 1;
            
            //StreamWriter sw = new StreamWriter(@"C:\Resultado.txt");

            //foreach (Temporal item2 in resultadoLista)
            //{
            //    CotizarArticulosCS auxCoti = item2.cotizar;
            //    sw.WriteLine(contador + " --> " + item2.resultado + " Articulo " + auxCoti.IdArticulo + 
            //        " CantArt " + auxCoti.CantidadArticulos + " Rubro " + auxCoti.IdRubro + " SubRubro " + auxCoti.IdSubRubro + 
            //        " CantidadSubRubro " + auxCoti.Cantidad + " Unidad " + auxCoti.IdUnidad);
            //    contador++;
            //}

            //sw.Close();

            return resultadoConsulta;
        }

        #region metodosGerman

        /// <summary>
        /// Obtiene todos los Sub Rubros de la base de datos
        /// </summary>
        /// <returns>Todos los Sub Rubros de la base de datos</returns>
        public List<SubRubroCS> obtenerSubRubros()
        {
            _listaSubRubros.Clear();
            _listaSubRubros = (new RubroDB()).ObtenerSubRubros();
            return _listaSubRubros;
        }

        /// <summary>
        /// Obtiene un sub rubro por el indice en el DataGrid
        /// </summary>
        /// <param name="_indice">indice a buscar</param>
        /// <returns>El sub rubro buscado; vacio en caso de no encontrarlo</returns>
        public SubRubroCS obtenerSubRubroXindiceDataGrid(Int16 _indice)
        {
            SubRubroCS resultado = new SubRubroCS();
            if (_listaSubRubros.Count >= 0)
            {
                resultado = _listaSubRubros[_indice];
            }
            return resultado;
        }

        /// <summary>
        /// Obtiene una lista de sub rubros por la descripcion del sub rubro pasado como parametro
        /// </summary>
        /// <param name="_subRub">Sub Rubro que contiene la descripcion buscada</param>
        /// <returns>Los Sub rubros buscados, vacio en caso de no encontrar nada</returns>
        public List<SubRubroCS> ObtenerSubRubrosXdescripcion(SubRubroCS _subRub)
        {
            _listaSubRubros.Clear();
            _listaSubRubros = ((new RubroDB()).ObtenerSubRubrosXdescripcion(_subRub));
            return _listaSubRubros;
        }
        
        /// <summary>
        /// Obtiene las cotizaciones de articulos por Articulos y Cantidad de Articulos pasados como parametros
        /// </summary>
        /// <param name="_articulo">Articulo utilizado para buscar</param>
        /// <param name="_porcentualesYcantidades">Porcentual utilizado para buscar</param>
        /// <returns>La lista de cotizaciones buscadas; vacio en caso de no encontrar nada</returns>
        public List<CotizarArticulosCS> ObtenerCotizarArticulosPorArticulo_CantidadesArt(ArticuloCS _articulo, CargaPorcentualesCantidadesCS _porcentualesYcantidades)
        {
            //devuelve el detalle a partir del codigo y la cantidad de un articulo pasado como parametro...
            //desarrollado por German
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            //List<CotizarArticulosCS> resultados = new List<CotizarArticulosCS>();            

            try
            {
                DataTable tabla = cotizarTA.GetDataByIdArticulo_CantidadArt(_articulo.Codigo, _porcentualesYcantidades.CantidadArticulos);
                ListaCotizar.Clear();
                if (tabla.Rows.Count > 0)
                {
                    foreach (DataRow item in tabla.Rows)
                    {
                        CotizarArticulosCS cotizar = new CotizarArticulosCS();

                        cotizar.IdArticulo = item["id_articulo"].ToString().ToUpper();
                        cotizar.CantidadArticulos = Convert.ToInt16(item["cantidadArt"].ToString());
                        cotizar.Renglon = Convert.ToInt16(item["renglon"].ToString());
                        cotizar.IdRubro = item["id_rubro"].ToString();
                        cotizar.IdSubRubro = item["id_subrubro"].ToString();
                        cotizar.Cantidad = Convert.ToDecimal(item["cantidad"].ToString());
                        cotizar.IdUnidad = item["id_unidad"].ToString();
                        //       Nuevo
                        cotizar.DescripUnidad = item["descrip_unidad"].ToString();
                        cotizar.DescripcionSubRubro = item["descripcion"].ToString();
                        cotizar.PrecioSubRubro = Convert.ToDecimal(item["precio_subRubro"], argento);
                        cotizar.TotalCantidadXprecioSubRubro = Convert.ToDecimal((Convert.ToDecimal(cotizar.Cantidad) * cotizar.PrecioSubRubro), argento);
                        // ---------------------------------------------------------------------------

                        ListaCotizar.Add(cotizar);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class CotizarArticulosDB -- Methods ObtenerCotizarArticulosPorRubro_y_SubRubro(codigoRubro, codigoSubRubro))", "Cuidado", MessageBoxButton.OK);
            }

            CalculoSubTotalYporcentajes(_porcentualesYcantidades);
            return ListaCotizar;
        }

        /// <summary>
        /// Obtiene una lista de Sub Rubros a partir del codigo del Sub Rubro pasado como parametro
        /// </summary>
        /// <param name="_subRub">Sub Rubro a buscar</param>
        /// <returns>La lista de Sub rubros buscados, vacio en caso contrario</returns>
        public List<SubRubroCS> ObtenerSR(SubRubroCS _subRub)
        {
            _listaSubRubros.Clear();
            _listaSubRubros = (new RubroDB()).ObtenerSR(_subRub);
            return _listaSubRubros;
        }

        /// <summary>
        /// calcula los porcentajes y totales unitarios del produsto en cuestion
        /// </summary>
        /// <param name="_porcentajes">Porcentual usado para el calculo</param>
        private void CalculoSubTotalYporcentajes(CargaPorcentualesCantidadesCS _porcentajes)
        {
            try
            {
                SubTotal = 0;
                Porcentaje_manoDeObra = 0;
                Porcentaje_gastosFijos = 0;
                Porcentaje_rentabilidad = 0;
                Porcentaje_insumos = 0;
                Precio_neto = 0;
                Unidad_neto = 0;
                Porcentaje_iva = 0;
                Unidad_final = 0;
                foreach (CotizarArticulosCS item in _listaDeCotizacion)
                {
                    SubTotal += item.TotalCantidadXprecioSubRubro;
                }
                // mano de obra
                //MessageBox.Show(_porcentajes.ManoDeObra.ToString());
                if (_porcentajes.ManoDeObra != 0)
                    Porcentaje_manoDeObra = (_porcentajes.ManoDeObra / 100) * SubTotal;
                else
                    Porcentaje_manoDeObra = 0;

                //gastos fijos
                //MessageBox.Show(_porcentajes.GastosFijos.ToString());
                if (_porcentajes.GastosFijos != 0)
                    Porcentaje_gastosFijos = (_porcentajes.GastosFijos / 100) * SubTotal;
                else
                    Porcentaje_gastosFijos = 0;

                //rentabilidad
                //MessageBox.Show(_porcentajes.Rentabilidad.ToString());
                if (_porcentajes.Rentabilidad != 0)
                    Porcentaje_rentabilidad = (_porcentajes.Rentabilidad / 100) * SubTotal;
                else
                    Porcentaje_rentabilidad = 0;

                //insumos
                //MessageBox.Show(_porcentajes.Insumos.ToString());
                if (_porcentajes.Insumos != 0)
                    Porcentaje_insumos = (_porcentajes.Insumos / 100) * SubTotal;
                else
                    Porcentaje_insumos = 0;

                //precio neto
                Precio_neto = SubTotal + Porcentaje_manoDeObra + Porcentaje_gastosFijos + Porcentaje_rentabilidad + Porcentaje_insumos;

                //unidad Neto
                Unidad_neto = (Precio_neto) / _porcentajes.CantidadArticulos;

                //iva
                Porcentaje_iva = (Unidad_neto * _porcentajes.Iva) / 100;

                //unidad Final
                Unidad_final = Unidad_neto + Porcentaje_iva;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " Error -- Class CotizarArticulosDB -- Metodo CalculoSubTotalYporcentajes", "Cuidado", MessageBoxButton.OK);
            }
        }

        //
        //falta desarrollar: actualizaria el valor del precio en la lista de subRubros
        //
        //public List<SubRubroCS> actualizarPrecioUnitario() { return obtenerSubRubros(); }

        /// <summary>
        /// Agrega un item a la cotizacion
        /// </summary>
        /// <param name="_articulo">Articulo relacionado con la cotizacion</param>
        /// <param name="_porcentualesYcantidades">Porcentual relacionado con el articulo</param>
        /// <param name="_cotizando">Item a agregar</param>
        /// <returns>La Lista de cotizaciones actualizada</returns>
        public List<CotizarArticulosCS> agregarCotizacion(ArticuloCS _articulo, CargaPorcentualesCantidadesCS _porcentualesYcantidades, CotizarArticulosCS _cotizando)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            ArticuloCS articulo = new ArticuloCS();
            articulo.Codigo = _articulo.Codigo;
            articulosDB _articuloDB = new articulosDB();

            RubroCS rubro = new RubroCS();
            rubro.IdRubro = _cotizando.IdRubro;
            RubroDB rubroDB = new RubroDB();

            SubRubroCS subRubro = new SubRubroCS();
            subRubro.IdRubro = _cotizando.IdRubro;
            subRubro.IdSubRubro = _cotizando.IdSubRubro;

            UnidadCS unidad = new UnidadCS();
            unidad.IdUnidad = _cotizando.IdUnidad;
            UnidadBD unidadDB = new UnidadBD();

            cotizarTA.Connection.Open();
            MySqlTransaction mitransaccion = cotizarTA.Connection.BeginTransaction();       
            try
            {
                if(_articuloDB.busca_Articulo_por_Codigo(articulo).Count == 0)
                    return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);
                if(rubroDB.ObtenerRubroPorCodigoExacto(rubro).IdRubro.Equals(""))
                    return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);
                if(rubroDB.ObtenerSubRubroPorCodigo(subRubro).IdSubRubro.Equals(""))
                    return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);
                if(unidadDB.ObtenerUnidadPorCodigo(unidad).IdUnidad.Equals(""))
                    return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);

                int result = cotizarTA.InsertCotizacion(_articulo.Codigo, _porcentualesYcantidades.CantidadArticulos, _cotizando.IdRubro,
                    _cotizando.IdSubRubro, _cotizando.Cantidad, _cotizando.IdUnidad);
                if (result == 1)
                {
                    mitransaccion.Commit();
                    //MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: CotizarArticulosDB - metodo :: agregarCotizacion - Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                cotizarTA.Connection.Close();
            }

            return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);
        }

        /**
         * Hecho por Bruno
         * Cargar varias cotizaciones de articulos por Excel
         */
        public int agregarCotizacionPorExcel(ArticuloCS _articulo, CargaPorcentualesCantidadesCS _porcentualesYcantidades, CotizarArticulosCS _cotizando)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();
            int result = 0;

            ArticuloCS articulo = new ArticuloCS();
            articulo.Codigo = _articulo.Codigo;
            articulosDB _articuloDB = new articulosDB();

            RubroCS rubro = new RubroCS();
            rubro.IdRubro = _cotizando.IdRubro;
            RubroDB rubroDB = new RubroDB();

            SubRubroCS subRubro = new SubRubroCS();
            subRubro.IdRubro = _cotizando.IdRubro;
            subRubro.IdSubRubro = _cotizando.IdSubRubro.PadLeft(4,'0');

            UnidadCS unidad = new UnidadCS();
            unidad.IdUnidad = _cotizando.IdUnidad;
            UnidadBD unidadDB = new UnidadBD();

            cotizarTA.Connection.Open();
            MySqlTransaction mitransaccion = cotizarTA.Connection.BeginTransaction();
            try
            {
                if (_articuloDB.busca_Articulo_por_Codigo(articulo).Count == 0)
                    return result;
                if (rubroDB.ObtenerRubroPorCodigo(rubro).IdRubro.Equals(""))
                    return result;
                if (rubroDB.ObtenerSubRubroPorCodigo(subRubro).IdSubRubro.Equals(""))
                    return result;
                if (unidadDB.ObtenerUnidadPorCodigo(unidad).IdUnidad.Equals(""))
                    return result;

                result = cotizarTA.InsertCotizacion(_articulo.Codigo, _porcentualesYcantidades.CantidadArticulos, _cotizando.IdRubro,
                    _cotizando.IdSubRubro.PadLeft(4, '0'), _cotizando.Cantidad, _cotizando.IdUnidad);
                if (result == 1)
                {
                    mitransaccion.Commit();
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: CotizarArticulosDB - metodo :: agregarCotizacionPorExcel - Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                cotizarTA.Connection.Close();
            }

            return result;
        }

        /// <summary>
        /// elimina un Item a la cotizacion
        /// </summary>
        /// <param name="_articulo">Articulo relacionado</param>
        /// <param name="_porcentualesYcantidades">Porcentual relacionado del Articulo</param>
        /// <param name="_cotizando">item a eliminar</param>
        /// <returns>La Lista de cotizaciones actualizada</returns>
        public List<CotizarArticulosCS> deleteCotizacion(ArticuloCS _articulo, CargaPorcentualesCantidadesCS _porcentualesYcantidades, CotizarArticulosCS _cotizando)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            cotizarTA.Connection.Open();
            MySqlTransaction mitransaccion = cotizarTA.Connection.BeginTransaction();       
            try
            {
                int result = cotizarTA.DeleteCotizarArticulo(_cotizando.IdArticulo, _cotizando.CantidadArticulos, _cotizando.Renglon);
                if (result == 1)
                {
                    mitransaccion.Commit();
                    MessageBox.Show("Operacion de Eliminación exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: CotizarArticulosDB - metodo :: deleteCotizacion - Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                cotizarTA.Connection.Close();
            }

            return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);
        }

        /// <summary>
        /// actualiza un item
        /// </summary>
        /// <param name="_articulo">Articulo Relacionado</param>
        /// <param name="_porcentualesYcantidades">Porcentual del articulo</param>
        /// <param name="_cotizando">item a actualizar</param>
        /// <returns>La Lista de cotizaciones actualizada</returns>
        public List<CotizarArticulosCS> updateCotizacion(ArticuloCS _articulo, CargaPorcentualesCantidadesCS _porcentualesYcantidades, CotizarArticulosCS _cotizando)
        {
            cotizararticuloTableAdapter cotizarTA = new cotizararticuloTableAdapter();

            cotizarTA.Connection.Open();
            MySqlTransaction mitransaccion = cotizarTA.Connection.BeginTransaction();       
            try
            {
                int result = cotizarTA.UpdateCotizacion(_cotizando.IdArticulo, 
                                                        _cotizando.CantidadArticulos,
                                                        _cotizando.IdRubro,
                                                        _cotizando.IdSubRubro,
                                                        _cotizando.Cantidad,
                                                        _cotizando.IdUnidad,
                                                        _cotizando.Renglon,
                                                        _cotizando.IdArticulo,
                                                        _cotizando.CantidadArticulos,
                                                        _cotizando.Renglon);
                if (result == 1)
                {
                    mitransaccion.Commit();
                    MessageBox.Show("Operacion de actualización exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: CotizarArticulosDB - metodo :: updateCotizacion - Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                cotizarTA.Connection.Close();
            }

            return ObtenerCotizarArticulosPorArticulo_CantidadesArt(_articulo, _porcentualesYcantidades);
        }

        #endregion metodosGerman
    }    
}
